package verins.BO;


import verins.DAO.PadronElectoralDAO;
import verins.algrtm.*;
import verins.beans.*;
import verins.beans.Padronelectoral;
import verins.beans.Estadopadron;
import verins.beans.Padronelectorallinea;
import verins.beans.Paginapadronelectoral;
import verins.beans.Personarnv;
import verins.beans.Personarnvxprocesoelectoral;
import verins.beans.Actaprocesamiento;
import java.util.*;

public class PadronElectoralBO {

    public static boolean save(Padronelectoral  padron,Usuario usuario){
        boolean ok=false;
        Log entrada=null;
        boolean reg=padron.getId()==0;
        ok= new PadronElectoralDAO().save(padron);
       
        if (reg)
           entrada=LogBO.crearEntradaLogSeguimiento(padron.getIdprocesoelectoral(), usuario.getIdusuario(), verins.Utils.Constantes.LSEG_REGISTRO, "Registro de padrón "+padron.getIdpadronelectoral());
        else
           entrada=LogBO.crearEntradaLogSeguimiento(padron.getIdprocesoelectoral(),  usuario.getIdusuario(), verins.Utils.Constantes.LSEG_MODIFICACION, "Registro de datos de padrón "+padron.getIdpadronelectoral());
        
        LogBO.registrarLog(entrada);
        
        return ok;
    }
    
     public static Padronelectoral findById(Padronelectoral  padron){
         return new PadronElectoralDAO().finByCodigo(padron.getIdpadronelectoral());
    }
     
     public static  List<Padronelectoral> findByCriterios(Padronelectoral  padron){
         return new PadronElectoralDAO().findByCriterios(padron);
    }
     public static List<Padronelectoral> findByProcesoElectoral(int idProcesoElectoral){
         Estadopadron estadoPadron= EstadoPadronBO.findByDescripcion("Revisado");
         return new PadronElectoralDAO().findByProcesoElectoral(idProcesoElectoral, estadoPadron.getIdestadopadron());
     }
     
    public static  String getNuevoCodigo(){
        return new PadronElectoralDAO().getNuevoCodigo();
    }

    public static void procesarPadron(Padronelectoral padron,Procesoempadronamiento procEmp,Usuario usuario){
        Actaprocesamiento acta= new Actaprocesamiento();
        acta.setFechainicio(Calendar.getInstance().getTime());
        acta.setIdpadronelectoral(padron);
        acta.setNumeroregistrosvalidos(0);
        acta.setNumeroregistrosinvalidos(0);
        acta.setTotalregistros(0);
        acta.setTipoprocesamiento("-");
        acta.setIdprocesoempadronamiento(procEmp);
        List<Ubigeoxprocesoelectoral> ubigeos = TipoParticipanteXProcesoBO.findAll(new Procesoelectoral(padron.getIdprocesoelectoral()));

        for (Paginapadronelectoral pag:padron.getPaginapadronelectoralList()){
            for (Padronelectorallinea linea: pag.getPadronelectorallineaList()){
                if (procesarPadronLinea(ubigeos, padron, pag, linea)){
                    acta.setNumeroregistrosvalidos(acta.getNumeroregistrosvalidos()+1);
                }
                else{
                    acta.setNumeroregistrosinvalidos(acta.getNumeroregistrosinvalidos()+1);
                }
                acta.setTotalregistros(acta.getTotalregistros()+1);
            }
        }
        acta.setFechafin(Calendar.getInstance().getTime());
        acta.setIdactaprocesamiento(0);

        padron.setEstado(new Estadopadron(17));
        PadronElectoralBO.save(padron,usuario);
        ActaProcesamientoBO.save(acta);
    }

    public static boolean procesarPadronLinea(List<Ubigeoxprocesoelectoral> ubigeos , Padronelectoral padron,Paginapadronelectoral pagina, Padronelectorallinea linea){
        Personarnv personaRNV = PersonarnvBO.findByDNI(linea.getDni());
        if (personaRNV==null){
            linea.setObservacion("14");

            return false;
        }
        if (!personaRNV.getApematerno().toUpperCase().equals(linea.getApematerno().toUpperCase())
                && !personaRNV.getApepaterno().toUpperCase().equals(linea.getApepaterno().toUpperCase())
                && !personaRNV.getNombres().toUpperCase().equals(linea.getNombre().toUpperCase())){
            linea.setObservacion("15");
            return false;
        }
        /*
        boolean ubigeovalido=false;
        for (int i=0; i<ubigeos.size(); i++){
            if (personaRNV.getUbigeo().equals(ubigeos.get(i).getTubigeo().getIdubigeo())){
                ubigeovalido=true;
                break;
            }
        }
        //comentado por mientras
        
        if (!ubigeovalido){
            linea.setObservacion("16");
            return false;
        }
        */
        Personarnvxprocesoelectoral persona=new Personarnvxprocesoelectoral();
        persona.setPersonarnvxprocesoelectoralPK(new PersonarnvxprocesoelectoralPK());
        persona.getPersonarnvxprocesoelectoralPK().setPersonarnv(personaRNV.getIdpersonarnv());
        persona.getPersonarnvxprocesoelectoralPK().setProcesoelectoral(padron.getIdprocesoelectoral());

        List<Personarnvxprocesoelectoral> personas=PersonarnvxprocesoelectoralBO.findAll(persona);

        if (personas != null && personas.size()>0){
            linea.setObservacion("11");
            return false;
        }
        try{
            AlgoritmoFirmasH algoritmoFirmas= new AlgoritmoFirmasH();
            if (!(personaRNV.getFirma()!=null && algoritmoFirmas.getVerificacion(personaRNV.getFirma(), linea.getFirma())>65)){
                linea.setObservacion("9");
                return false;
            }
        }
        catch(Exception e){
            linea.setObservacion("9");
            return false;
        }
        /*
        try{
            AlgoritmoHuellasMinucias algoritmoHuellas= new AlgoritmoHuellasMinucias();
            if (!(linea.getHuella()!=null && algoritmoHuellas.getVerificacion(personaRNV.getHuella(), linea.getHuella())>65)){
                linea.setObservacion("10");
                return false;
            }
        }
        catch(Exception e){
            linea.setObservacion("10");
            return false;
        } 
         */
        persona.setPadronelectoral(padron.getIdpadronelectoral());
        persona.setPagina(pagina.getPaginapadronelectoralPK().getNumeropagina());
        try{
            verins.Utils.IOmethods.guardarFirmante(persona);
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
        }
        linea.setObservacion("12");
        return true;
    }

    public static boolean verificarInscripcion(Procesoelectoral ele, Procesoempadronamiento emp){
        try{
            return verins.Utils.IOmethods.verificaInscripcion(ele, emp);
        }
        catch(Exception ex){
            return false;
        }
    }
}
